export default class LoginManager {
  // 添加登录锁，防止短时间内重复登录
  static loginLock = false;
  static lastLoginTime = 0;
  
  static async silentLogin() {
    // 如果正在登录中，直接返回
    if (this.loginLock) {
      console.log('登录正在进行中，跳过重复调用');
      return null;
    }
    
    // 如果距离上次登录时间太短（小于3秒），跳过登录
    const now = Date.now();
    if (now - this.lastLoginTime < 3000) {
      console.log('距离上次登录时间太短，跳过重复调用');
      return null;
    }
    
    this.loginLock = true;
    this.lastLoginTime = now;
    
    try {
      // 获取微信登录凭证
      const { code } = await uni.login({
        provider: 'weixin'
      });
      
      // 调用云函数登录
      const res = await uni.request({
        url: 'https://fc-mp-0c81a8be-aa9a-4fae-8d6c-54b797768401.next.bspapp.com/cloudfunctions/wx-silent-login',
        method: 'post',
        data: { code }
      });
      
      // 检查响应状态
      if (res.statusCode !== 200) {
        throw new Error('网络请求失败：' + res.statusCode);
      }
      
      // res.data 才是实际的响应数据
      const responseData = res.data;
      console.log("res.data", responseData);
      
      // 保存登录状态和openid
      if (responseData.code === 0) {
        // 保存token
        if (responseData.data) {
          uni.setStorageSync('uni_id_token', responseData.data.token);
          uni.setStorageSync('uni_id_token_expired', responseData.data.tokenExpired);
        }
        
        // 保存openid
        if (responseData.openid) {
          uni.setStorageSync('openid', responseData.openid);
        }
        
        return responseData.data;
      }
      
      throw new Error(res.data.message || '登录失败');
    } catch (e) {
      console.error('静默登录失败：', e);
      throw e;
    } finally {
      this.loginLock = false;
    }
  }
  
  static async checkLoginState() {
    const token = uni.getStorageSync('uni_id_token');
    const tokenExpired = uni.getStorageSync('uni_id_token_expired');
    console.log(tokenExpired < Date.now());
    
    if (!token || !tokenExpired) {
      const loginResult = await this.silentLogin();
      // 如果silentLogin返回null（因为重复调用被跳过），则返回本地存储的token信息
      if (loginResult === null) {
        return { 
          token: uni.getStorageSync('uni_id_token'),
          tokenExpired: uni.getStorageSync('uni_id_token_expired')
        };
      }
      return loginResult;
    }
    
    return { token, tokenExpired };
  }
}
